package br.org.ifrr.repository;

import java.io.Serializable;
import java.util.List;

import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;

import org.apache.commons.lang3.StringUtils;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

import br.org.ifrr.model.Material;
import br.org.ifrr.repository.filter.MateriaFilter;

public class Materias implements Serializable {

	private static final long serialVersionUID = 1L;

	@Inject
	private EntityManager manager;

	public Material guardar(Material materias) {
		return manager.merge(materias);
	}

	public Material porId(Long id) {
		return manager.find(Material.class, id);
	}

	public Material portombCefet(String tombCefet) {
		try {
			return manager
					.createQuery(
							"from Material where upper(tombCefet) = :tombCefet",
							Material.class)
					.setParameter("tombCefet", tombCefet.toUpperCase())
					.getSingleResult();
		} catch (NoResultException e) {
			return null;
		}
	}

	public Material portombIfrr(String tombIfrr) {

		try {
			return manager
					.createQuery(
							"from Material where upper(tombIfrr) = :tombIfrr",
							Material.class)
					.setParameter("tombIfrr", tombIfrr.toUpperCase())
					.getSingleResult();
		} catch (NoResultException e) {
			return null;
		}
	}

	@SuppressWarnings("unchecked")
	public List<Material> filtrados(MateriaFilter filtro) {
		Session session = manager.unwrap(Session.class);
		Criteria criteria = session.createCriteria(Material.class)

		// fazemos uma associação (join) com cliente e nomeamos como "c"
				.createAlias("gestor", "g").createAlias("empresa", "e");

		if (StringUtils.isNotBlank(filtro.getDetombamentoIfrr())) { // id deve
																	// ser maior
																	// ou igual
			// (ge = greater or equals) a filtro.getDetombamentoIfrr()
			criteria.add(Restrictions.ge("tombIfrr",
					filtro.getDetombamentoIfrr()));

		}

		if (StringUtils.isNotBlank(filtro.getAtetombamentoIfrr())) {
			// id deve ser menor ou igual (le = lower or equal) a
			// filtro.numeroDe
			criteria.add(Restrictions.le("tombIfrr",
					filtro.getAtetombamentoIfrr()));
		}

		if (StringUtils.isNotBlank(filtro.getTombamentoCefet())) {
			// acessamos o nome do cliente associado ao pedido pelo alias "c",
			// criado anteriormente
			criteria.add(Restrictions.ilike("tombCefet",
					filtro.getTombamentoCefet(), MatchMode.EXACT));
		}

		if (StringUtils.isNotBlank(filtro.getNomeSetor())) {
			// acessamos o nome do vendedor associado ao pedido pelo alias "v",
			// criado anteriormente
			criteria.add(Restrictions.ilike("g.setor", filtro.getNomeSetor(),
					MatchMode.EXACT));
		}

		if (StringUtils.isNotBlank(filtro.getNome())) {
			criteria.add(Restrictions.ilike("especificacao", filtro.getNome(),
					MatchMode.ANYWHERE));
		}

		return criteria.addOrder(Order.asc("tombIfrr")).list();
	}

}

// public Material somaTotal() {
/*
 * Session session = manager.unwrap(Session.class); Criteria criteria =
 * session.createCriteria(Material.class); return (Material)
 * criteria.setProjection(Projections.sum("valorBem"));
 */
// }

/*
 * if (filtro.getDataCriacaoDe() != null) {
 * criteria.add(Restrictions.ge("dataCriacao", filtro.getDataCriacaoDe())); }
 * 
 * if (filtro.getDataCriacaoAte() != null) {
 * criteria.add(Restrictions.le("dataCriacao", filtro.getDataCriacaoAte())); }
 */

